/*
 * @Author: HuangYue
 * @Date: 2022-04-11 15:47:50
 * @LastEditors: HuangYue
 * @LastEditTime: 2022-04-17 16:14:58
 * @FilePath: /graduation/mock/deviceManage.js
 * @Description:设备管理 api
 */
import { randomPhoneNumber, randomNickname, randomName } from '../src/util/random';
import { optionsType, optionsCT, optionsMR } from '../src/consts/deviceOptions';
/**
 * @description: 模拟网络请求延时
 * @param {*} time
 * @return {*}
 */
export const waitTime = (time = 100) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(true);
    }, time);
  });
};
// 设备数据 mock 集合
export let tableListDataSource = [];
// 设备编号
export let didBase = 100000000000;
// 设备注册状态
const stautsEnum = {
  0: 'Unregistered', // 未注册
  1: 'Registering', // 注册中
  2: 'Registered', // 已注册
  3: 'Expired', // 已过期
};

// 所属医院地址
const hospitalAddresses = [
  '四川省成都市高新区万象北路18号',
  '四川省成都市国学巷37号',
  '成都市青羊区一环路西2段32号',
  '成都市武侯区人民南路四段55号',
  '成都市武侯区人民南路三段14号',
];
// 所属医院名称
const hospitalNames = [
  '成都市第一人民医院',
  '四川大学华西医院',
  '四川省人民医院',
  '四川肿瘤医院',
  '四川大学华西口腔医院',
];
// 厂家
// const factorys = ['GE', 'Siemens', 'Phillips', 'Other'];
// 设备类型
// const deviceTypes = ['CT', 'MR', 'Xray', 'Tube'];
// todo : 添加产品线枚举
// todo : 添加随机获取 设备厂家/设备类别/产品线 数据function
// todo : 新增 deviceType

/**
 * @function 生成设备参数
 * @description 包括 设备厂家/设备类别/产品线
 * 探测器 场强
 */
function generateDeviceParams() {
  // 从 optionsType 中获取设备厂家
  const vendor = optionsType[Math.floor(Math.random() * 10) % optionsType.length];
  // 从 vendor 中获取设备类别
  const type = vendor.children[Math.floor(Math.random() * 10) % vendor.children.length];
  // 从 type 中获取产品线
  const typeName = type.children[Math.floor(Math.random() * 10) % type.children.length];
  let detector = '',
    intensity = '';
  if (type.value === 'CT') {
    detector = optionsCT[Math.floor(Math.random() * 10) % optionsCT.length].value;
  } else {
    intensity = optionsMR[Math.floor(Math.random() * 10) % optionsMR.length].value;
  }
  return {
    vendor: vendor.value,
    type: type.value,
    typeName: typeName.value,
    detector,
    intensity,
  };
}
/**
 * @function 生成设备数据
 * @param {*} tableListDataSource
 * @returns
 */
const generateTableListData = (tableListDataSource) => {
  for (let i = 0; i < 50; i += 1) {
    tableListDataSource.push({
      did: `${didBase + i}`,
      status: stautsEnum[Math.floor(Math.random() * 10) % 4],
      deviceName: randomNickname('Device-', 5), // 设备名称
      concat: randomName(), // 联系人名称
      phoneNumber: randomPhoneNumber(), // 联系人电话
      hospitalName: hospitalNames[Math.floor(Math.random() * 10) % 5],
      hospitalAddress: hospitalAddresses[Math.floor(Math.random() * 10) % 5],
      engineers: [{ label: '黄越', value: '黄越' }], // 给设备绑定的工程师
      ...generateDeviceParams(), // 随机生成设备参数
    });
    didBase += i;
  }
  return tableListDataSource;
};
// 执行文件时，生成表格数据
generateTableListData(tableListDataSource);

/**
 * 获取表格数据
 */
export const getTableData = () => {
  // 1. 如果 tableData 中本来就有数据，那么直接返回
  if (tableListDataSource.length > 0) {
    return tableListDataSource;
  } else {
    // 2. 如果 tableData 中没有数据
    // 那么直接生成
    tableListDataSource = generateTableListData(tableListDataSource);
    return tableListDataSource;
  }
};

export default {
  'GET /api/getAllDevice': async (req, res) => {
    await waitTime(2000);
    res.send({
      success: true,
      data: tableListDataSource,
      total: tableListDataSource.length,
    });
  },
  'POST /api/deleteDeviceByDid': async (req, res) => {
    const { did } = req.body;
    const temp = [];
    tableListDataSource.forEach((item) => {
      if (item.did !== did) {
        temp.push(item);
      }
    });
    tableListDataSource = temp;
    await waitTime(2000);
    res.send({
      success: true,
      data: tableListDataSource,
      total: tableListDataSource.length,
    });
  },
  'POST /api/updateDevice': async (req, res) => {
    const current = req.body;
    const temp = [];
    tableListDataSource.forEach((item) => {
      if (item.did === current.did) {
        temp.push(current);
      } else {
        temp.push(item);
      }
    });
    await waitTime(2000);
    tableListDataSource = temp;
    res.send({
      success: true,
      data: tableListDataSource,
      total: tableListDataSource.length,
    });
  },
  'POST /api/addDevice': async (req, res) => {
    const current = req.body;
    tableListDataSource.unshift({ ...current, did: didBase, avatar: avatar[0] });
    didBase += 1;
    await waitTime(2000);
    res.send({
      success: true,
      data: tableListDataSource,
      total: tableListDataSource.length,
    });
  },
};
